;int cargar_arbol_huffm =an(codigo_t *tabla_codigos , nodo_arbol_t **a)
%include "macros.mac"
extern malloc
global cargar_arbol_huffman

section .text

%define tabla_codigos [ebp+8]
%define a [ebp+12]

%define off_a_simbolo 0
%define off_a_apariciones 1
%define off_a_valido 5
%define off_a_padre 9
%define off_a_izq 13
%define off_a_der 17

%define off_cod_codigo 0
%define off_cod_codigo_rev 4
%define off_cod_long 8
%define off_cod_valido 12

%define tam_camino [ebp-4]
%define camino [ebp-8]
%define nodo_nuevo [ebp-12]
%define iter [ebp-16]

cargar_arbol_huffman:
	convencion_C 16

	mov dword eax,21	;sizeof nodo_arbol_t
	push eax
	call malloc		; eax == nodo_arbol_t *raiz=(nodo_arbol_t*)malloc(sizeof(nodo_arbol_t))
	add esp,4
	mov dword [eax],0
	mov dword [eax+off_a_valido],0	;raiz->valido = 0
	mov dword [eax+off_a_padre] ,0	;raiz->padre = NULL
	mov dword [eax+off_a_izq],0	;raiz->izq = NULL
	mov dword [eax+off_a_der],0	;raiz->der = NULL
	mov ebx,a			;ebx=a**
	mov [ebx],eax			;a*=raiz
	xor ecx,ecx		;int tam=0


ciclo1:		;while tam<256 == while ecx < 1024
	;~push ecx
	mov ebx,tabla_codigos			;ebx apunta a tabla_codigos

		;edx = tabla_codigo[i].valido
	mov edi, ecx
	shl edi,4
	mov edx,[ebx+edi+off_cod_valido]
	cmp edx,1				;IF tabla_codigo[i].valido == 1
	jne near fin_if1				;THEN
		;edx = tabla_codigo[i].valido
	mov edx,[ebx+edi+off_cod_long]
	
	mov tam_camino,edx			;int tam_camino = tabla_codigo[i].long_codigo
		;edx = tabla_codigo[i].valido
	mov edx,[ebx+edi+off_cod_codigo_rev]
	
	mov camino,edx				;unsigned int = tabla_codigo[i].codigo_rev

	mov esi,a				
	mov esi,[esi]
	mov iter, esi
	

;~;	pop ecx

ciclo1_2:					;while tam_camino>0

	mov dword edi,1				;int i=1
	and edi,camino				;IF(i==camino%2)
	cmp edi,1
	jne el_ultimo_bit_es_0

;el_ultimo_bit_es_1				;THEN

	mov esi, iter
	mov edx,[esi+off_a_izq] 		;edx = iter->izq
	cmp edx,0				;IF iter->izq == NULL
	jne hay_nodo1

;no_habia_nodo

	pusha
	push dword 21				;sizeof(nodo_arbol_t)
	call malloc				;nodo_arbol_t* nuevo_nodo=(nodo_arbol_t*)malloc(sizeof(nodo_arbol_t))
	add esp,4
	mov nodo_nuevo, eax
	popa
	mov  eax,nodo_nuevo
	mov esi, iter
	mov [esi+off_a_izq],eax			;iter->izq = nuevo_nodo
	mov dword [eax+off_a_izq],0		;nuevo_nodo->izq = NULL
	mov dword [eax+off_a_valido],0		;nuevo_nodo->valido = 0
	mov dword [eax+off_a_der],0		;nuevo_nodo->der = NULL
	mov [eax+off_a_padre],esi		;nuevo_nodo->padre = iter
	mov esi,[esi+off_a_izq]			;iter = iter->izq
	mov iter,esi
	jmp fin_ciclo1_2

hay_nodo1:

	mov esi, iter
	mov esi,[esi+off_a_izq]			;iter = iter->der
	mov iter,esi
	jmp fin_ciclo1_2

el_ultimo_bit_es_0:
	mov esi, iter
	mov edx,[esi+off_a_der]			;IF iter->der == NULL
	cmp edx,0
	jne hay_nodo2

;no_habia_nodo2
	pusha	
	push dword 21				;sizeof(nodo_arbol_t)
	call malloc				;nodo_arbol_t* nuevo_nodo=(nodo_arbol_t*)malloc(sizeof(nodo_arbol_t))
	add esp,4
	mov nodo_nuevo, eax
	popa
	mov  eax,nodo_nuevo
	mov esi, iter
	mov [esi+off_a_der],eax			;iter->der = nuevo_nodo
	mov dword [eax+off_a_valido],0		;nuevo_nodo->valido = 0
	mov dword [eax+off_a_izq],0		;nuevo_nodo->izq = NULL
	mov dword [eax+off_a_der],0		;nuevo_nodo->der = NULL
	mov [eax+off_a_padre],esi		;nuevo_nodo->padre = iter
	mov esi,[esi+off_a_der]			;iter = iter->der
	mov iter,esi
	jmp fin_ciclo1_2

hay_nodo2:
	mov esi, iter
	mov esi,[esi+off_a_der]			;iter = iter->der
	mov  iter,esi

fin_ciclo1_2:

	dec dword tam_camino			;tam_camino--
	mov eax,camino
	shr eax,1				;camino = camino/2
	mov camino,eax
	mov eax,tam_camino
	cmp dword eax,0			
	jne ciclo1_2

;sigo ciclo1
	mov esi, iter
	mov eax,ecx
	mov byte [esi+off_a_simbolo],al
	mov dword [esi+off_a_valido],1
fin_if1:

	inc ecx	;tam++
	cmp ecx,256
	jne ciclo1

fin:
	;~lea esi, [esi]
	

	
	mov eax,1
	convencion_C_fin 16
	ret

